import type { Linter } from 'eslint';

import { command, comments, disableds, ignores, importPluginConfig, javascript, jsdoc, jsonc, node, perfectionist, prettier, regexp, test, turbo, typescript, unicorn, vue } from './configs';
import { customConfig } from './custom-config';

type FlatConfig = Linter.Config;

type FlatConfigPromise = FlatConfig | FlatConfig[] | Promise<FlatConfig> | Promise<FlatConfig[]>;

async function defineConfig(config: FlatConfig[] = []) {
    const configs: FlatConfigPromise[] = [
        vue(),
        javascript(),
        ignores(),
        prettier(),
        typescript(),
        jsonc(),
        disableds(),
        importPluginConfig(),
        node(),
        perfectionist(),
        comments(),
        jsdoc(),
        unicorn(),
        test(),
        regexp(),
        command(),
        turbo(),
        ...customConfig,
        ...config,
    ];

    const resolved = await Promise.all(configs);

    return resolved.flat();
}

export { defineConfig };
